package com.yt.db.utils;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Component
public class RedisTokenUtil {
    private final StringRedisTemplate redisTemplate;
    private static final long TOKEN_EXPIRE = 3600; // 1小时过期

    public RedisTokenUtil(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // 生成Token并存储到Redis
    public String generateToken(String username) {
        String token = "TOKEN:" + UUID.randomUUID().toString().replace("-", "");
        // 存储Token到Redis，键为token，值为username，设置过期时间
        redisTemplate.opsForValue().set(token, username, TOKEN_EXPIRE, TimeUnit.SECONDS);
        return token;
    }

    // 验证Token并返回用户名
    public String validateToken(String token) {
        return redisTemplate.opsForValue().get(token);
    }

    // 注销Token（登出时删除）
    public void deleteToken(String token) {
        redisTemplate.delete(token);
    }

    // 校验Token是否有效（未过期）
    public boolean isTokenValid(String token) {
        String redisKey = token;
        // 检查Redis中是否存在该键（过期键会被自动删除，不存在即表示过期）
        return redisTemplate.hasKey(redisKey);
    }

    // 获取Token剩余过期时间（秒）
    public long getTokenRemainingTime(String token) {
        String redisKey = token;
        // 返回剩余过期时间（秒）：
        // -2：已过期（键不存在）
        // -1：未设置过期时间（永不过期）
        // 正数：剩余秒数
        return redisTemplate.getExpire(redisKey, TimeUnit.SECONDS);
    }
}
